package UiLag;
import java.util.Scanner;
import KontrolLag.*;
import ModelLag.*;
import java.util.InputMismatchException;
import java.util.ArrayList;
import java.lang.Exception.*;

/**
 * Denne klasse staar for UI til alt der har med personer at goere.
 */
public class PersonUI
{
    private PersonCtr personCtr;
    private static PersonUI instance;
    private PersonContainer personContainer;
    private SalgsUI salgsUI;

    /**
     * Construktor til klassen PersonUI
     */
    private PersonUI()
    {
        personCtr = PersonCtr.getInstance(); 
        personContainer = PersonContainer.getInstance();
    }

    /**
     * singleton
     */
    public static PersonUI getInstance()
    {
        if(instance == null)
        {
            instance = new PersonUI();
        }
        return instance;
    }

    /**
     * metode som starter person menuen op
     */
    public void start()
    {

        addressMenu();
    }

    /**
     * metode som inderholder menu
     */
    public void addressMenu()
    {
        boolean exit = false;
        while(!exit)
        {
            int choise = 0;
            try
            {
                choise = writePersonMenu();
            }
            catch(InputMismatchException im)
            {
                System.out.println("Du skal indtaste et tal");
                stop();
            }

            if(choise == 1)
            {
                try
                {
                    printInfo();
                }
                catch(IndexOutOfBoundsException i)
                {
                    System.out.println("Ingen med det telefon nummer findes");
                    stop();
                }
                catch(NullPointerException n)
                {
                    System.out.println(" forkert telefon nummer er indtastet");
                    stop();
                }

            }
            else
            {
                if(choise == 2)
                {
                    try
                    {
                        personCtr.opretKunde(inputName(), inputAdresse(), inputPostalCode(), inputBy(), inputPhone(), inputRabat(), inputCvrNr(), inputBrugere());
                    }
                    catch(InputMismatchException e)
                    {
                        System.out.println(" du har indtastet noget forkert, proev igen");
                        stop();
                    }
                    catch(Exception e)
                    {
                        System.out.print(e);
                        stop();
                    }

                }
                else
                {
                    if(choise == 3)
                    {
                        try
                        {
                            personCtr.opretLeverandoor(inputName(), inputAdresse(), inputPostalCode(), inputBy(), inputPhone(), inputIndkobsRabat(), inputKommentar());
                        }
                        catch(InputMismatchException e)
                        {
                            System.out.println(" du har indtastet noget forkert, proev igen");
                            stop();
                        }
                        catch(Exception e)
                        {
                            System.out.print(e);
                            stop();
                        }
                    }
                    else
                    {
                        if(choise == 4)
                        {
                            try
                            {
                                personCtr.opretPersonale(inputName(), inputAdresse(), inputPostalCode(), inputBy(), inputPhone(), inputRabat());
                            }
                            catch(InputMismatchException e)
                            {
                                System.out.println(" du har indtastet noget forkert, proev igen");
                                stop();
                            }
                            catch(Exception e)
                            {
                                System.out.print(e);
                                stop();
                            }
                        }
                        else
                        {
                            if(choise == 5)
                            {
                                sletPerson();
                            }
                            else
                            {
                                if(choise == 6)
                                {
                                    try
                                    {
                                        opdaterKunde();
                                    }
                                    catch(IndexOutOfBoundsException e)
                                    {
                                        System.out.println("Der er ingen kunder med det telefon nummer");
                                        stop();
                                    }
                                    catch(InputMismatchException i)
                                    {
                                        System.out.println(" du har indtastet noget forkert, proev igen");
                                        stop();
                                    }
                                    catch(NullPointerException n)
                                    {
                                        System.out.println("Ingen med det telefon nummer kan findes");
                                        stop();
                                    }

                                }
                                else
                                {
                                    if(choise == 7)
                                    {
                                        try
                                        {
                                            opdaterPersonale();
                                        }
                                        catch(IndexOutOfBoundsException e)
                                        {
                                            System.out.println("Der er ingen kunder med det telefon nummer");
                                            stop();
                                        }
                                        catch(InputMismatchException i)
                                        {
                                            System.out.println(" du har indtastet noget forkert, proev igen");
                                            stop();
                                        }
                                        catch(NullPointerException n)
                                        {
                                            System.out.println("Ingen med det telefon nummer kan findes");
                                            stop();
                                        }
                                    }
                                    else
                                    {
                                        if(choise == 8)
                                        {
                                            try
                                            {
                                                opdaterLeverandoer();
                                            }
                                            catch(IndexOutOfBoundsException e)
                                            {
                                                System.out.println("Der er ingen kunder med det telefon nummer");
                                                stop();
                                            }
                                            catch(InputMismatchException i)
                                            {
                                                System.out.println(" du har indtastet noget forkert, proev igen");
                                                stop();
                                            }
                                            catch(NullPointerException n)
                                            {
                                                System.out.println("Ingen med det telefon nummer kan findes");
                                                stop();
                                            }
                                        }
                                        else
                                        {
                                            if(choise == 9)
                                            {
                                                udskrivPersoner();
                                                stop();
                                            }

                                            if(choise > 9)
                                            {

                                                exit = true;
                                            }
                                        }
                                    }
                                }
                            }  
                        }

                    }
                }

            }
        }
    }

    /**
     * metode som udskriver de valg man har i menuen
     */
    public int writePersonMenu()
    {      // makes an object keyboard to read input from the screen
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\f *** Person Menu ***");
        System.out.println(" (1) Vis information om en person");
        System.out.println(" (2) Tilfoej Kunde");
        System.out.println(" (3) Tilfoej Leverandoer");
        System.out.println(" (4) Tilfoej Personale");
        System.out.println(" (5) Slet person");
        System.out.println(" (6) Opdatere Kunde");
        System.out.println(" (7) Opdatere Leverandoer");
        System.out.println(" (8) Opdatere Personale");
        System.out.println(" (9) Udskriv alle personer");
        System.out.println(" (10 Tilbage");
        System.out.print("\n foretag et valg: ");

        int choise = keyboard.nextInt();
        return choise;
    }

    /**
     * Metode som forespoerger paa data til en person. Disse 
     */
    public void printInfo()
    {
        Person p = personCtr.findPerson(inputPhone());
        System.out.println("\n Personens navn:           " + p.getName());
        System.out.println("Personens type:           " + p.getType());
        System.out.println("Personens telefon nummer: " + p.getTelefonNummer());
        System.out.println("Tryk enter for at gaa tilbage");
        Scanner keyboard = new Scanner(System.in);
        keyboard.nextLine();
    }

    /**
     * Metode som tager input til phone og retunerer dette
     * @returns phone 
     */
    public String inputPhone()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Indtast telefon nummer:  ");
        String phone = keyboard.nextLine();
        return phone;
    } 

    /**
     * Metode som tager input til cvrNr og retunerer dette
     * @returns cvrNr 
     */
    public String inputCvrNr()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Indtast Cvr nummer:  ");
        String phone = keyboard.nextLine();
        return phone;
    } 

    /**
     * Metode som tager input til name og retunerer dette
     * @returns name 
     */
    public String inputName()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Write Name:  ");
        String name = keyboard.nextLine();
        return name;
    }

    /**
     * Metode som tager input til adresse og retunerer dette
     * @returns adresse 
     */
    public String inputAdresse()
    {
        // makes an object keyboard to read input from the console
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\n Indtast Adresse: ");
        String address = keyboard.nextLine();
        return address;
    }

    /**
     * Metode som tager input til by og retunerer dette
     * @returns by 
     */
    public String inputBy()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Indtast by:  ");
        String city = keyboard.nextLine();
        return city;
    } 

    /**
     * Metode som tager input til postalCode og retunerer dette
     * @returns postalCode 
     */
    public String inputPostalCode()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Indtast post nummer:  ");
        String code = keyboard.nextLine();
        return code;
    }

    /**
     * Metode som tager input til rabat og retunerer dette
     * @returns rabat 
     */
    public long inputRabat()
    {
        // creates an object keyboard to read data from the keyboard
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\n Indtast rabat: ");
        long no = keyboard.nextInt();
        return no;
    }

    /**
     * Metode som tager input til brugere og retunerer dette
     * @returns brugere 
     */
    public String inputBrugere()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Indtast brugere:  ");
        String code = keyboard.nextLine();
        return code;
    }

    /**
     * Metode som tager input til indkoebsRabat og retunerer dette
     * @returns indkoebsRabat 
     */
    public long inputIndkobsRabat()
    {
        // creates an object keyboard to read data from the keyboard
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\n Indtast indkoebs rabat: ");
        long no = keyboard.nextInt();
        return no;
    }

    /**
     * Metode som tager input til kommentar og retunerer dette
     * @returns kommentar 
     */
    public String inputKommentar()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Tilfoej kommentar:  ");
        String code = keyboard.nextLine();
        return code;
    }

    /**
     * Metode som tager input til salgsstatistik og retunerer dette
     * @returns salgsstatistik 
     */
    public long inputSalgsstatistik()
    {
        // creates an object keyboard to read data from the keyboard
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\n Indtast Salgsstatistik: ");
        long no = keyboard.nextInt();
        return no;

    }

    /**
     * Metode som 
     */
    public void opdaterPersonale()
    {
        Person p = personCtr.findPerson(inputPhone());
        if(p.getType() == "Personale")
        {
            opdaterPerson(p);
            p.opdaterMedarbejder(inputRabat());

        }
        else
        {
            System.out.println("fejl, der findes ikke en medarbejder med det telefon nummer");
            stop();
        }
    }

    public void opdaterKunde()
    {
        Person p = personCtr.findPerson(inputPhone());
        if(p.getType() == "Kunde")
        {
            opdaterPerson(p);
            p.opdaterKunde(inputBrugere(), inputCvrNr(), inputRabat());

        }
        else
        {
            System.out.println("fejl, en kunde med det telefon nummer findes ikke");
            stop();
        }
    }

    public void opdaterLeverandoer()
    {
        Person p = personCtr.findPerson(inputPhone());
        if(p.getType() == "Kunde")
        {
            opdaterPerson(p);
            p.opdaterLeverandoer(inputIndkobsRabat(), inputKommentar());

        }
        else
        {
            System.out.println("fejl, der findes ikke en leverandoer med det telefon nummer");
            stop();
        }
    }

    /**
     * metode som udskriver informationer omkring alle person.
     */
    public void udskrivPersoner()
    {
        for(Person p : personContainer.getPersoner())
        {
            System.out.println("\n Personens navn:           " +p.getName());
            System.out.println("Personens type:           " +p.getType());
            System.out.println("Personens telefon nummer: " +p.getTelefonNummer());
        }
    }

    /**
     * metode som fors'ger at slette en person, ud fra det input paa telefonnummer som bliver givet.
     */
    public void sletPerson()
    {
        try
        {
            personCtr.sletPerson(inputPhone());

        }
        catch(Exception e)
        {
            System.out.println("Personen kunne ikke slettes");
            stop();
        }
    }
    /**
     * metode som pauser programmet og starter igen naar der bliver trykket "enter" paa tastaturet.
     */
    public void stop()
    {
        System.out.println("\n Tryk enter for at gaa tilbage");
        Scanner keyboard = new Scanner(System.in);
        keyboard.nextLine();
    }

    private void opdaterPerson(Person p)
    {
        p.setName(inputName());
        p.setAdresse(inputAdresse());
        p.setPostNr(inputPostalCode());
        p.setTlfNr(inputPhone());
        p.setBy(inputBy());        
    }

}
